package com.lf.DAO;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import com.lf.entity.mapper.RowMapper;


public class BaseDao {
	//链接对象
	private Connection conn=null;
	//执行对象
	private PreparedStatement pstmt=null;
	//数据集
	private ResultSet rs=null;

	/**
	 * 获取链接对象
	 * @return 链接对象
	 */
	public Connection getConnection(){
		try {
			//初始化context对象
			Context ctx=new InitialContext();
			//获取数据源
			DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/root");
			conn=ds.getConnection();
			System.out.println("数据链接成功！");
		} catch (NamingException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;

	}
	/**
	 * 关闭所有资源
	 */
	public void closeAll(){
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(pstmt!=null){
			try {
				pstmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	/**
	 * 通用查询方法
	 * @param sql sql语句
	 * @param objs 参数列表
	 * @param rm  映射转换对象
	 * @return 对应类型的List集合
	 */
	public <T> List<T> query(String sql,Object[] objs,RowMapper<T> rm){
		List<T> list=null;
		conn=this.getConnection();//1.获取连接对象
		
		try {//2.创建执行对象
			pstmt=conn.prepareStatement(sql);
			if(objs!=null){//3.判断有无参数（如果有，添加到执行对象中）
				for (int i = 0; i < objs.length; i++) {
					pstmt.setObject(i+1, objs[i]);
					}
				}
			rs=pstmt.executeQuery();//4.执行sql语句，返回数据集
			list=rm.getTList(rs);//5.数据集转换成对应的List集合
		} catch (SQLException e) {
			e.printStackTrace();
		}
		finally{
			this.closeAll();
		}
		return list;
	}
	/**
	 * 通用添删改方法
	 * @param sql sql语句
	 * @param objs 参数列表
	 * @return 受影响行数
	 */
	public int update(String sql,Object[] objs){
		int count=0;
		conn=this.getConnection();
		try {
			pstmt=conn.prepareStatement(sql);
			if(objs!=null){
				for (int i = 0; i < objs.length; i++) {
					pstmt.setObject(i+1, objs[i]);
					}
				}
			count=pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			this.closeAll();
		}
		return count;
	}
}
